﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { history } from '@umijs/max';
import { message } from 'antd';
import { loginPath, merchantApiPrefixPath, operationApiPrefixPath } from './config';
import { getUrlParams } from './utils/useRouter';

// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  code: number;
  msg: string;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: () => {},
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      if (error.name === 'BizError') {
      } else if (error.response) {
        const { status, data = {} } = error.response;
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        // message.error(`Response status: ${status}`);
        message.error(data.msg || '请求出错');
        if (status === 401) {
          window.localStorage.removeItem('user_id');
          window.localStorage.removeItem('access_token');
          window.localStorage.removeItem('user_info');
          history.replace(loginPath);
        }
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        message.error('Request error, please retry.');
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      const params = getUrlParams(window.location.href);
      const access_token = params.access_token || window.localStorage.getItem('access_token');
      const user_info = window.localStorage.getItem('user_info');
      const userInfo = user_info ? JSON.parse(user_info) : {};
      const headers = Object.assign({}, config.headers);

      if (access_token) {
        headers.Authorization = 'Bearer ' + access_token;
      }

      if (user_info) {
        if (config.url?.includes(operationApiPrefixPath)) {
          headers['Jx-Groupid'] = userInfo.groupID;
          headers['Jx-Subsidiaryid'] = userInfo.subsidiaryID;
        }
        if (config.url?.includes(merchantApiPrefixPath)) {
          headers['Jx-Shopid'] = userInfo.groupID;
        }
      }

      return { ...config, headers };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;

      if (data?.success === false) {
        message.error(data.msg || '请求失败！');
      }
      return response;
    },
  ],
};
